from pymodbus.client.sync import ModbusTcpClient
from pymodbus.exceptions import ModbusException
import numpy as np
import math
client = ModbusTcpClient('10.107.128.6',502)
#创建一个ModbusClient实例，用于建立与Modbus设备的RTU通信
#method参数设置为'rtu'以指定通信协议，port参数根据实际连接的串行端口进行设置
#（例如Linux系统中可能是'/dev/ttyUSB0'，Windows中可能是'COM3'），baudrate参数设置传输速率，
#这些参数应与设备文档或配置相匹配。
if client.connect():##如果连接成功
    print("Modbus RTU Client Connected")
else:
    print("Failed to connect to Modbus RTU Client")

result = client.read_holding_registers(address=0,count=3,unit=1)
#读取保持寄存器
#读取地址为1的起始位置、数量为10的连续寄存器。unit参数表示从哪个单元（即设备ID）读取数据
if not result.isError():
    print("Register Values: ", result.registers)
else:
    print("Failed to read registers")
#向设备的单个寄存器写入数据，可以使用以下代码
write_response = client.write_register(address=1, value=25, unit=1)
##接受地址、要写入的值以及目标设备的单元ID
if not write_response.isError():
    print("Written successfully")
else:
    print("Failed to write register")
#如果要写入多个寄存器，可以使用write_registers方法：
#设左上角坐标为0，0，检测框左上角为x1y1,左下角为x2y2,右上角为x3y3,右下角为x4y4，中心点为（x1+x4)/2,(x1+x4)/2
#假设镜头广度为120度，设图片像素为400*400，那么角度x就是tan x=(abs(（x1+x4)/2)-200)/(200/tan60)，
#角度x=arctanx（(abs(（x1+x4)/2)-200)/(200/tan60)，取整，将这个数据传入寄存器
pic_w=400
pic_h=400
x1=300
x4=250
y1=50
y4=100
angle_w=60
angle_h=60
Rotation_angle_w=round(math.atan2(abs((x1+x4)/2-pic_w-2), (pic_w/2/math.tan(angle_w))))
zzf_w=0
if(Rotation_angle_w>=0):zzf_w = 1;
values = [Rotation_angle_w, zzf_w]
write_response = client.write_registers(address=1, values=values, unit=2)
if not write_response.isError():
    print("Multiple registers written successfully")
else:
    print("Failed to write multiple registers")
Rotation_angle_h=round(math.atan2(abs((y1+y4)/2-pic_h-2), (pic_h/2/math.tan(angle_h))))
zzf_h=0
if(Rotation_angle_h>=0):zzf_h = 1;
values = [Rotation_angle_h, zzf_h]
#处理异常

try:
    # 尝试执行Modbus操作
    response = client.read_holding_registers(address=1, count=10, unit=1)
except ModbusException as ex:
    print("An error occurred:", str(ex))
client.close()